package exception;

/**
 * 演示异常的抛出
 * throw关键字可以主动对外抛出一个异常
 *  * 通常下列情况会主动抛出异常:
 *  * 1:当程序出现了一个异常，但是该异常不应当有当前代码片段处理时可以将其抛出给上层调用者
 *  * 2:程序可以运行，但是不满足业务场景(本案例就属于这个情况)
 */
public class Person {
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) throws IllegalAgeException {
        if (age<0||age>100){
            /*
               Exception下有两种分类
               检查异常和非检查异常
               非检查异常:当程序抛出此类异常，编译器并不强制处理该异常
                        不检查是否提供异常处理机制
               检查异常:当程序抛出此类异常，编译器检查是否有异常处理机制处理该异常
               没有则编译不通过
               RuntimeException是非检查异常，剩下的全是检查异常
               其子类异常也属于非检查异常
               NUllPointerException                   空指针异常
               ArrayIndexOutOfBoundsException         数组下标越界
               NumberFormatException                  数字格式异常
               ClassCastException                     类造型异常
             */
            //throw new RuntimeException("年龄不合法");
            /*
               当使用throw抛出一个非RuntimeException的其他异常
               必须在当前方法上使用throws声明该异常抛出
             */
            throw new IllegalAgeException("年龄不合法");
        }
        this.age = age;
    }
}
